package top.jacktgq.wait_notify.guardedSuspension.v1;

import java.util.List;

import top.jacktgq.utils.LogUtils;


/**
 * 
 * @Title: GuardedObject.java
 * @Package top.jacktgq.wait_notify.guardedSuspension.v1
 * @Description: 同步模式之保护性暂停：用在一个线程等待另一个线程的执行结果
 * @author CandyWall
 * @date 2020年11月1日 下午6:04:23
 * @version V1.0
 */
public class GuardedSuspensionDemo {
	public static void main(String[] args) {
		GuardedObject object = new GuardedObject();
		// 线程1等待线程2 的下载结果
		new Thread(() -> {
			//等待结果
			LogUtils.log("等待结果：");
			List<String> list = (List<String>) object.get();
			LogUtils.log("结果大小：" + list.size());
		}, "t1").start();
		new Thread(() -> {
			LogUtils.log("执行下载：");
			object.complete(Downloader.download());
		}, "t2").start();
	}
	
}

class GuardedObject {
	private Object response; // 结果

	public Object get() {
		synchronized (this) {
			// 没有结果
			while (response == null) {
				try {
					this.wait();
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			return response;
		}
	}

	public void complete(Object response) {
		synchronized (this) {
			// 给结果成员变量赋值
			this.response = response;
			this.notifyAll();
		}
	}
}
